home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Common / math / Camera.cpp next >
C/C++ Source or Header  |  1999-07-23  |  1KB  |  46 lines

  1. #include "Camera.h"
  2.  
  3. #include "R3Matrix.h"
  4.  
  5. #define A    mDir.mX
  6. #define B    mDir.mY
  7. #define C    mDir.mZ
  8.  
  9.  
  10.  
  11. void Camera::CalcTransMatrix( R3Matrix& outT ) const {
  12.     V3    v;
  13.     R3Matrix Rot;
  14.     float    cosa, sina;
  15.     float    BC    = sqrt( B*B + C*C );
  16.     float    ABC    = mDir.magnitude();
  17.     
  18.     if ( BC > 0.000001 ) {
  19.         outT.setRow( 1, BC/ABC, - A * B / (BC*ABC), - A * C / (BC*ABC) );
  20.         outT.setRow( 2, 0, C / BC, - B / BC );
  21.         outT.setRow( 3, A / ABC, B / ABC, C / ABC ); }
  22.     else {
  23.         outT.setRow( 1, 0, -1, -1 );
  24.         outT.setRow( 2, 0, 1, -1 );
  25.         outT.setRow( 3, 1, 0, 0 );
  26.     }
  27.     
  28.     // Make the camera always orient "up" in the mUpDir direction...
  29.     v.transform( outT, mUpDir );        
  30.     v.mZ = 0;
  31.     v.normalize();
  32.     
  33.     // Catch the case where our up dir is exactly normal to the view plane
  34.     if ( v.magnitude() >= 0.000001 ) { 
  35.         cosa = v.mY / v.magnitude();
  36.         sina = v.mX / v.magnitude();
  37.         Rot.setRow( 1, cosa, - sina, 0 );
  38.         Rot.setRow( 2, sina, cosa, 0 );
  39.         Rot.setRow( 3, 0, 0, 1 );
  40.         outT.transform( Rot );
  41.     }
  42.     
  43.     // Scale all the coeffs that determine the x and y cords
  44.     for ( int i = 0; i < 6; i++ ) 
  45.         outT.mM[ i ] *= mXYScale;
  46. }